package edu.asselvi.seguros.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import edu.asselvi.seguros.db.ConnectionFactory;
import edu.asselvi.seguros.db.DbUtils;
import edu.asselvi.seguros.exception.ESegurosErros;
import edu.asselvi.seguros.exception.SegurosException;
import edu.asselvi.seguros.pojo.Sinistro;

public class SinistroDao extends DbUtils{

	Connection conn = null;

	public SinistroDao(Connection conn) {
		this.conn = conn;
	}

	public SinistroDao() throws SegurosException {
		this.conn = new ConnectionFactory().getConnection();
	}


	public Sinistro insert(Sinistro sinistro) throws SegurosException {

		String sql = "INSERT INTO SINISTROS (ID_SINISTRO, DATA_SINISTRO, DESCRICAO, DOCUMENTACAO, FK_ID_ITEM) VALUES (?,?,?,?,?)";
		PreparedStatement p = null;

		try {
			p = conn.prepareStatement(sql);
			sinistro.setId_sinistro(getNextId("SEQ_SINISTROS", conn));
			int cont = 1;

			p.setInt(cont++, sinistro.getId_sinistro());
			p.setDate(cont++, utilDatetoSQLDate(sinistro.getData_sinistro())); //converte util.date para sql.date
			p.setString(cont++, sinistro.getDescricao());
			p.setString(cont++, sinistro.getDocumentacao());
			p.setInt(cont++, sinistro.getFk_id_item());

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_INSERCAO);

		} finally {
			close(p);
		}

		return sinistro;
	}

	public Sinistro getSinistro(int id_sinistro) throws SegurosException {

		String sql = "SELECT * FROM SINISTROS WHERE ID_SINISTRO = ?";

		Sinistro sinistro = new Sinistro();
		PreparedStatement p = null;
		ResultSet rs = null;

		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_sinistro);
			rs = p.executeQuery();

			while (rs.next()) {

				sinistro.setId_sinistro(rs.getInt("ID_SINISTRO"));
				sinistro.setData_processamento(rs.getDate("DATA_PROCESSAMENTO"));
				sinistro.setData_sinistro(rs.getDate("DATA_SINISTRO"));
				sinistro.setDescricao(rs.getString("DESCRICAO"));
				sinistro.setDocumentacao(rs.getString("DOCUMENTACAO"));
				sinistro.setFk_id_item(rs.getInt("FK_ID_ITEM"));

			}
		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_RECUPERAR_DADOS);

		} finally {
			close(p);
			close(rs);
		}
		return sinistro;		
	}

	public List<Sinistro> listByItem(int id_sinistro) throws SQLException, SegurosException {

		String sql = "SELECT * FROM SINISTROS WHERE FK_ID_ITEM = ?";

		List<Sinistro> lista = null;
		PreparedStatement p = null;

		java.sql.ResultSet rs = null;

		try {
			lista = new ArrayList<Sinistro>();
			p = conn.prepareStatement(sql);
			p.setInt(1, id_sinistro);
			rs = p.executeQuery();

			while (rs.next()) {
				Sinistro sinistro = new Sinistro();

				sinistro.setId_sinistro(rs.getInt("ID_SINISTRO"));
				sinistro.setData_processamento(rs.getDate("DATA_PROCESSAMENTO"));
				sinistro.setData_sinistro(rs.getDate("DATA_SINISTRO"));
				sinistro.setDescricao(rs.getString("DESCRICAO"));
				sinistro.setDocumentacao(rs.getString("DOCUMENTACAO"));
				sinistro.setFk_id_item(rs.getInt("FK_ID_ITEM"));

				lista.add(sinistro);
			}
			if (lista.isEmpty()){
				throw new SegurosException(ESegurosErros.ERRO_ZERO_REGISTROS);
			} 

		} finally {
			close(rs);
			close(p);
		}

		return lista;		
	}

	public void remove(int id_sinistro) throws SegurosException {

		String sql = "DELETE FROM SINISTROS WHERE ID_SINISTRO = ?";

		PreparedStatement p = null;

		try {
			p = conn.prepareStatement(sql);
			p.setInt(1, id_sinistro);

			p.executeUpdate();

		} catch (SQLException e) {
			throw new SegurosException(ESegurosErros.ERRO_REMOVER_DADOS);

		} finally {
			close(p);
		}

	}

	public void update (Sinistro sinistro) throws SQLException {

		String sql = "UPDATE SINISTROS SET DATA_SINISTRO = ?, DESCRICAO = ?, DOCUMENTACAO = ?, FK_ID_ITEM = ? WHERE ID_SINISTRO = ?";

		PreparedStatement p = null;
		
		try {
			p = conn.prepareStatement(sql);
			int cont = 1;
			p.setDate(cont++, utilDatetoSQLDate(sinistro.getData_sinistro())); //converte util.date para sql.date
			p.setString(cont++, sinistro.getDescricao());
			p.setString(cont++, sinistro.getDocumentacao());
			p.setInt(cont++, sinistro.getFk_id_item());
			p.setInt(cont++, sinistro.getId_sinistro());

			p.executeUpdate();
			p.close();
			conn.close();

		} finally {
			close(p);
		}
	}
}
